package com.zhixing.user.controller;

import cn.hutool.core.util.StrUtil;
import com.zhixing.common.exception.ZhixingException;
import com.zhixing.common.utils.Res;
import com.zhixing.common.utils.UserContext;
import com.zhixing.user.domain.dto.LoginDTO;
import com.zhixing.user.domain.dto.PasswordDTO;
import com.zhixing.user.domain.dto.RegisterDTO;
import com.zhixing.user.domain.dto.UserDTO;
import com.zhixing.user.domain.vo.TokenVO;
import com.zhixing.user.domain.vo.UserInfoVO;
import com.zhixing.user.domain.vo.UserVO;
import com.zhixing.user.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static com.zhixing.common.domain.enums.HttpStatus.NEWPASSWORD_NOT_SAME;
import static com.zhixing.common.domain.enums.HttpStatus.PASSWORD_NOT_CONSISTENT;

/**
 * 用户接口
 */
@Slf4j
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 用户登录
     * @param loginDTO 登录信息数据传输对象
     * @return token
     */
    @PostMapping("/login")
    public Res<TokenVO> login(@Validated @RequestBody LoginDTO loginDTO){
        log.info("用户服务调用，用户登录，手机号：{}", loginDTO.getPhone());
        return Res.ok(userService.login(loginDTO));
    }

    /**
     * 用户注册
     * @param registerDTO 注册信息数据传输对象
     * @return 操作结果
     */
    @PostMapping("/register")
    public Res<Void> register(@Validated @RequestBody RegisterDTO registerDTO){
        log.info("用户服务调用，用户注册，手机号：{}", registerDTO.getPhone());
        if (!StrUtil.equals(registerDTO.getPassword(), registerDTO.getConfirmPassword())) throw new ZhixingException(PASSWORD_NOT_CONSISTENT);
        userService.register(registerDTO);
        return Res.ok();
    }

    /**
     * 用户退出
     * @return 操作结果
     */
    @DeleteMapping("/logout")
    public Res<Void> logout() {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("用户服务调用，用户退出，用户id：{}", userId);
        userService.logout(userId);
        return Res.ok();
    }

    /**
     * 获取用户信息
     * @return UserInfoVO 用户信息
     */
    @GetMapping("/userInfo")
    public Res<UserInfoVO> getUserInfo() {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("用户服务调用，获取用户信息，用户id：{}", userId);
        return Res.ok(userService.getUserInfo(userId));
    }

    /**
     * 获取用户详细信息
     * @return UserVO 用户详细信息
     */
    @GetMapping("/detailInfo")
    public Res<UserVO> getDetailInfo() {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("用户服务调用，获取用户详细信息，用户id：{}", userId);
        return Res.ok(userService.getDetailInfo(userId));
    }

    /**
     * 更新用户信息
     * @param userDTO 更新用户信息数据传输对象
     * @return 操作结果
     */
    @PutMapping("/userInfo")
    public Res<Void> updateUserInfo(@Validated @RequestBody UserDTO userDTO){
        log.info("用户服务调用，更新用户详细，用户id：{}", userDTO.getId());
        userService.updateUserInfo(userDTO);
        return Res.ok();
    }

    /**
     * 更新用户密码
     * @param passwordDTO 更新用户密码数据传输对象
     * @return 操作结果
     */
    @PutMapping("/password")
    public Res<Void> updatePassword(@Validated @RequestBody PasswordDTO passwordDTO){
        Integer userId = UserContext.getUserInfo().getId();
        log.info("用户服务调用，更新用户密码，用户id：{}", userId);
        if (!StrUtil.equals(passwordDTO.getNewPassword(), passwordDTO.getConfirmPassword())) throw new ZhixingException(PASSWORD_NOT_CONSISTENT);
        if (StrUtil.equals(passwordDTO.getOldPassword(), passwordDTO.getNewPassword())) throw new ZhixingException(NEWPASSWORD_NOT_SAME);
        userService.updatePassword(userId, passwordDTO);
        return Res.ok();
    }
}
